<?php

class Controller {

    public function inicio() {
        include CAMINO . 'app/views/inicio.php';
    }

    public function validar_login() {
        if (!isset($_POST['email'])) {
            header('Location: ' . DOMINIO . 'inicio');
            die();
        }
        /*
         * En lugar de pasar el error por $_GET lo paso con una session global
         * para que no se pueda ver en la barra de direccion del navegador
         * 
         * Destruyo primero la $_SESSION['LOGINERROR'] por si existe
         */
        destruir_session(SESSIONINFOR, 'IDSESSIONINFOR');
        $usuario = new Usuario();
        if ($usuario->comprobar_login($_POST['email'], $_POST['clave'])) {
            if ($usuario->activacion == '0') {
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'LOGINERROR', 'Todavia no has activado tu cuenta. Si no has recibido el mensaje de activaci&oacute;n, haz clic <a href="' . DOMINIO . 'reenviar_activacion">aqu&iacute;</a>');
                require CAMINO . 'app/views/inicio.php';
            }
            if ($usuario->facebook != '0') {
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'LOGINERROR', 'Para acceder con el email introducido, debes hacer clic en "Accede con tu cuenta de facebook"');
                require CAMINO . 'app/views/inicio.php';
            }
            $codigo_acceso = md5($_POST['clave']) . md5($_POST['email']);
            establecer_session_privada('codigo_acceso', $codigo_acceso);
            if (isset($_POST['recordar_login'])) {
                $expire = time() + 2592000; /* 30 dias */
                setcookie(COOKIEACCESO, $codigo_acceso, $expire);
            }

            header('Location: ' . DOMINIO . 'foro');
            die();
        }
        establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'LOGINERROR', 'El email o la clave introducida no son correctos, por favor, vuelve a intentarlo.');
        require CAMINO . 'app/views/inicio.php';
    }

    public function registro() {
        require CAMINO . 'app/views/registro.php';
    }

    public function validar_registro() {
        require_once CAMINO . 'app/recaptchalib.php';
        $email = $_POST['email'];
        $email = strtolower($email); /* pasa a minusculas el email para la base de datos */
        $clave = $_POST['clave'];
        $nombre = $_POST['nombre'];
        $apellidos = $_POST['apellidos'];
        $recaptcha = $_POST['recaptcha_response_field'];
        $privatekey = '6LejfesSAAAAAN5jZHuxZjcY6Ngk_5qr0Wz2cS0E';
        $respuesta_recaptcha = recaptcha_check_answer(
                $privatekey, $_SERVER['REMOTE_ADDR'], $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field']);


        $array_errores = array();
        $usuario = new Usuario();

        if (!$respuesta_recaptcha->is_valid) {
            $array_errores[] = 'El captcha no es correcto';
            $error_recaptcha = $respuesta_recaptcha->error;
        }
        if (faltan_post_obligatorios(array('email', 'clave', 'nombre', 'apellidos'))) {
            $array_errores[] = 'Te falta alg&uacute;n campo obligatorio por rellenar';
        }
        if (validar_email($email) === FALSE) {
            $array_errores[] = 'El email introducido no es v&aacute;lido';
        } elseif ($usuario->get_datos($email)) {
            $array_errores[] = 'Ya existe una cuenta con el email introducido';
        }
        if (validar_texto($clave, 16, 4) === FALSE) {
            $array_errores[] = 'La clave no puede contener <code>&lt;&gt;/\'"`-\</code> ni puede tener mas de 16 caracteres ni menos de 4';
        }
        if (validar_texto($nombre, 24) === FALSE) {
            $array_errores[] = 'El nombre no puede contener <code>&lt;&gt;/\'"`-\</code> ni puede tener mas de 24 caracteres';
        }
        if (validar_texto($apellidos, 34) === FALSE) {
            $array_errores[] = 'Los apellidos no pueden contener <code>&lt;&gt;/\'"`-\</code> ni pueden tener mas de 34 caracteres';
        }

        $foto = 'app/views/fotos_usuarios/avatar.png';
        if ($_FILES['foto']['error'] === 0) {
            $extensiones = array('gif', 'jpeg', 'jpg', 'png');
            $aux = explode('.', $_FILES['foto']['name']);
            $extension = strtolower(end($aux));
            if (
                    ($_FILES['foto']['type'] == 'image/gif' ||
                    $_FILES['foto']['type'] == 'image/jpeg' ||
                    $_FILES['foto']['type'] == 'image/jpg' ||
                    $_FILES['foto']['type'] == 'image/pjpeg' ||
                    $_FILES['foto']['type'] == 'image/x-png' ||
                    $_FILES['foto']['type'] == 'image/png') &&
                    $_FILES['foto']['size'] < 153600 &&
                    in_array($extension, $extensiones)
            ) {
                $foto = 'app/views/fotos_usuarios/user_' . rand(999, 99999) . substr(md5(time()), 0, 10) . '.' . $extension;
                while (file_exists(CAMINO . $foto)) {
                    $foto = 'app/views/fotos_usuarios/user_' . rand(999, 99999) . substr(md5(time()), 0, 10) . '.' . $extension;
                }
                if (is_array($array_errores) && count($array_errores) === 0) {
                    move_uploaded_file($_FILES['foto']['tmp_name'], CAMINO . $foto);
                }
            } else {
                $array_errores[] = 'La imagen introducida no es v&aacute;lida: debe ser gif, jpeg, jpg o png y no debe superar los 150kb';
            }
        }
        /*
         * En lugar de pasar el error por $_GET lo paso con una session global
         * para que no se pueda ver en la barra de direccion del navegador
         * 
         * Destruyo primero la $_SESSION['REGISTROERROR'] por si existe
         */
        destruir_session(SESSIONINFOR, 'IDSESSIONINFOR');
        if (is_array($array_errores) && count($array_errores) > 0) {
            establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'REGISTROERROR', $array_errores);
            require CAMINO . 'app/views/registro.php';
        }
        $datos = array(
            'email' => $email,
            'clave' => $clave,
            'nombre' => $nombre,
            'apellidos' => $apellidos,
            'foto' => (DOMINIO . $foto),
            'facebook' => 0,
            'activacion' => 0
        );
        $usuario->insertar_datos($datos);
        establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'REGISTROCORRECT', 'Te has regitrado correctamente');
        require CAMINO . 'app/views/registro.php';
    }

    public function reenviar_activacion() {
        /*
         * comprobar el envio por post
         */
        if (isset($_POST['email'])) {
            /*
             * En lugar de pasar el error por $_GET lo paso con una session global
             * para que no se pueda ver en la barra de direccion del navegador
             * 
             * Destruyo primero la $_SESSION['REENVIOERROR'] por si existe
             */
            destruir_session(SESSIONINFOR, 'IDSESSIONINFOR');
            $usuario = new Usuario();
            /*
             * cuando llamo al metodo comprobar_login y el email existe
             * el objeto contiene los datos del usuario. Si comprobar_login
             * devuelve TRUE compruebo si la propiedad activacion es diferente de 0
             */
            if ($usuario->comprobar_login($_POST['email'], $_POST['clave'])) {
                if ($usuario->activacion != '0') {
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'REENVIOERROR', 'Tu cuenta ya fue activada');
                    require CAMINO . 'app/views/reenviar_activacion.php';
                } /* if esta activado */
                $to = $_POST['email'];
                $subject = 'Activa tu cuenta';
                $action = 'activar_cuenta';
                $option = $usuario->codigo_activacion;
                $nombre = $usuario->nombre;
                $content = 'Para activar tu cuenta, deber&aacute;s hacer clic en el siguiente link:';
                if (enviar_email($to, $subject, $action, $option, $nombre, $content)) {
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'REENVIOCORRECT', 'Hemos reenviado un correo a tu direcci&oacute;n para activar tu cuenta.');
                    require CAMINO . 'app/views/reenviar_activacion.php';
                } /* if envia email */
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'REENVIOERROR', 'Ha habido alg&uacute;n problema al enviar el email. Por favor, vuelve a intentarlo');
                require CAMINO . 'app/views/reenviar_activacion.php';
            } /* if login correcto */
            establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'REENVIOERROR', 'El email y la clave introducida no son correctos. Por favor, vuelve a intentarlo');
            require CAMINO . 'app/views/reenviar_activacion.php';
        } /* if envia post */
        require CAMINO . 'app/views/reenviar_activacion.php'; // si no envia post
    }

    public function activar_cuenta() {
        if (isset($_GET['option'])) {
            $codigo_activacion = $_GET['option'];
            /*
             * En lugar de pasar el error por $_GET lo paso con una session global
             * para que no se pueda ver en la barra de direccion del navegador
             * 
             * Destruyo primero la $_SESSION['ACTIVARERROR'] por si existe
             */
            destruir_session(SESSIONINFOR, 'IDSESSIONINFOR');
            $usuario = new Usuario();
            switch ($usuario->activar_cuenta($codigo_activacion)) {
                case Usuario::ACTIVADO:
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'ACTIVARCORRECT', 'Tu cuenta ha sido activada correctamente. Ya puedes entrar al foro introduciendo tus datos <a href="' . DOMINIO . 'inicio">aqu&iacute;</a>');
                    require CAMINO . 'app/views/activar_cuenta.php';
                    break;
                case Usuario::FUE_ACTIVADO:
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'ACTIVARERROR', 'Tu cuenta ya fue activada anteriormente.');
                    require CAMINO . 'app/views/activar_cuenta.php';
                    break;
                case Usuario::NO_ACTIVADO:
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'ACTIVARERROR', 'Ha habido algun error al activar tu cuenta. Para recibir otro nuevo mensaje de activaci&oacute;n, haz clic <a href="' . DOMINIO . 'reenviar_activacion">aqu&iacute;</a>');
                    require CAMINO . 'app/views/activar_cuenta.php';
                    break;
                default:
                    break;
            }
        }
        include CAMINO . 'app/views/inicio.php'; /* si no hay GET['option'] le llevo a inicio */
    }

    public function recordar_clave() {
        /*
         * Otra forma de comprobar el envio por post
         */
        if (isset($_POST['email'])) {
            /*
             * En lugar de pasar el error por $_GET lo paso con una session global
             * para que no se pueda ver en la barra de direccion del navegador
             * 
             * Destruyo primero la $_SESSION['RECORDARERROR'] por si existe
             */
            destruir_session(SESSIONINFOR, 'IDSESSIONINFOR');
            $email = $_POST['email'];
            if (validar_email($email) === FALSE) {
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'RECORDARERROR', 'El email introducido no es correcto. Por favor, vuelve a intentarlo');
                require CAMINO . 'app/views/recordar_clave.php';
            }
            $usuario = new Usuario();
            if ($usuario->get_datos($email)) {
                if ($usuario->facebook != '0') {
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'RECORDARERROR', 'El email introducido pertenece a tu cuenta de facebook.');
                    require CAMINO . 'app/views/recordar_clave.php';
                }
                /*
                 * El codigo para crear una nueva clave, que se enviara en el link
                 * es el campo `codigo_acceso` ( md5($clave) . md5($email) ) que es unico para cada usuario
                 * Cuando se crea la nueva clave, es necesario hacer un update
                 * de los campos `clave` y `codigo_acceso`:
                 * $clave = md5($clave);
                 * $codigo_acceso = $clave . md5($email);
                 */
                if ($usuario->recordar_clave()) {
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'RECORDARCORRECT', 'Te hemos enviado un correo para que puedas crear una nueva clave.</br>Si no lo has recibido, haz clic <a href="' . DOMINIO . 'recordar_clave">aqu&iacute;</a>');
                    require CAMINO . 'app/views/recordar_clave.php';
                } /* if envia email */
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'RECORDARERROR', 'Ha ocurrido alg&uacute;n error al enviarte el email.</br>Para volver a intentarlo, haz clic <a href="' . DOMINIO . 'recordar_clave">aqu&iacute;</a>');
                require CAMINO . 'app/views/recordar_clave.php';
            } /* if existe email */
            establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'RECORDARERROR', 'El email introducido, no esta registrado en nuestra web. Para registrarte haz clic <a href="' . DOMINIO . 'registro">aqu&iacute;</a>');
            require CAMINO . 'app/views/recordar_clave.php';
        } /* if envia post */
        require CAMINO . 'app/views/recordar_clave.php'; /* si no envia post */
    }

    public function cambiar_clave() {
        /*
         * En lugar de pasar el error por $_GET lo paso con una session global
         * para que no se pueda ver en la barra de direccion del navegador
         * 
         * Destruyo primero la $_SESSION['CAMBIARERROR'] por si existe
         */
        destruir_session(SESSIONINFOR, 'IDSESSIONINFOR');
        if (isset($_GET['option'])) {
            $codigo_acceso = $_GET['option'];
            if (validar_texto($codigo_acceso) === FALSE) {
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'CAMBIARERRORCODIGO', 'El link de cambio de clave es incorrecto.</br>Si quieres que te enviemos otro nuevo correo, haz clic <a href="' . DOMINIO . 'recordar_clave">aqu&iacute;</a>');
                require CAMINO . 'app/views/cambiar_clave.php';
            } /* if $_GET['option'] no es valido */
            $usuario = new Usuario();
            if (!$usuario->buscar_codigo_acceso($codigo_acceso)) {
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'CAMBIARERRORCODIGO', 'El link de cambio de clave, ya ha sido utilizado anteriormente.</br>Si quieres que te enviemos otro nuevo correo, haz clic <a href="' . DOMINIO . 'recordar_clave">aqu&iacute;</a>');
                require CAMINO . 'app/views/cambiar_clave.php';
            } /* if no encuentra codigo acceso */
            /*
             * si ha llegado hasta aqui significa que se encontro el codigo de acceso 
             * y $usuario ahora contiene $rows[0] con todos sus datos 
             */
            /*
             * comprobar el envio por post
             */
            if (isset($_POST['clave'])) {
                $clave = $_POST['clave'];
                if (validar_texto($clave, 16, 4) === FALSE) {
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'CAMBIARERROR', 'La clave no puede contener <code>&lt;&gt;/\'"`-\</code> ni puede tener mas de 16 caracteres ni menos de 4</br>Por favor vuelve a intentarlo');
                    require CAMINO . 'app/views/cambiar_clave.php';
                }
                if ($clave != $_POST['clave_repetida']) {
                    establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'CAMBIARERROR', 'No has repetido la clave correctamente</br>Por favor vuelve a intentarlo');
                    require CAMINO . 'app/views/cambiar_clave.php';
                }
                $usuario->cambiar_clave($clave);
                establecer_session_global(SESSIONINFOR, 'IDSESSIONINFOR', 'CAMBIARCORRECT', 'Tu clave ha sido cambiada. Ya puedes acceder al foro con tu nueva clave <a href="' . DOMINIO . 'inicio">aqu&iacute;</a>');
                require CAMINO . 'app/views/cambiar_clave.php';
            } /* if envia post */
            require CAMINO . 'app/views/cambiar_clave.php'; /* si no envia post */
        } /* if existe $_GET['option'] */
        require CAMINO . 'app/views/inicio.php'; /* si no existe $_GET['option'] le llevo a inicio */
    }

    /**
     * Metodo para cerrar la sesion del usuario conectado.
     * Si se conecto a traves de facebook le llevo al link de desconexion de facebook
     * El cual tras cerrar la sesion  en facebook me redirecciona a la raiz de mi sitio
     * 
     * @global type $user
     * @global type $logoutURL
     */
    public function cerrar_sesion() {
        global $user;
        global $logoutURL;
        destruir_todas_las_sessiones();
        if ($user) {
            header('Location: ' . $logoutURL);
        } else {
            header('Location: ' . DOMINIO . 'inicio');
        }
        die();
    }

}
